//package algorithm;
//
//import java.text.SimpleDateFormat;
//import java.util.ArrayList;
//import java.util.Collections;
//import java.util.Date;
//import java.util.List;
//
//import javax.swing.JOptionPane;
//
//import comparators.AppointmentComparatorLength;
//
//import entities.Appointment;
//import entities.Calendar;
//import entities.Category;
//import fachlogik.Administration;
//
//public class Tools implements ToolInterface {
//
//private Administration admin;
//
//public Tools() {
//    admin = admin.getInstance();
//}
//
//public void listToReschedule(List<Appointment> liste) {
//    for (Appointment a : liste) {
//        findGap(a);
//    }
//}
//
//public void rescheduleAppointment(Date von, Date bis, Appointment appointmentToReschedule) {
//    Appointment app = appointmentToReschedule;
//
//    Date gap = findGap(app);
//    if (gap != null)
//    {
//        long dauer = app.getLength();
//        app.setBegin(gap);
//        app.setEnd(new Date(gap.getTime() + dauer));
//        SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm");
//        JOptionPane
//                .showMessageDialog(null, "Beginn: " + app.getBegin() + ", Ende: " + app.getEnd());
//        return;
//    }
//    JOptionPane.showMessageDialog(null, "Diese Appointment konnte nicht gerescheduled werden");
//}
//
//public Date findGap(Appointment a) {
//
//    Date von = admin.getRescheduleErlaubtVon(); // 20:00 //Begrenzung des
//                                                // Zeitraums, in den
//                                                // gereschedult werden darf.
//    Date bis = admin.getRescheduleErlaubtBis(); // 21
//
//    Category cat = a.getCategory();
//    Date anfang = cat.getAnfangszeit(); // 10:10 //Begrenzung der Uhrzeit laut
//                                        // Category des zu reschedulenden Apps.
//    Date ende = cat.getEndzeit(); // 19:30
//    boolean weErlaubt = cat.getWochenendeErlaubt();
//
//    Calendar c = a.getCalendar();
//
//    List<Appointment> appointmentliste = admin.appointmentsSortieren(admin // holen
//                                                                           // aller
//                                                                           // Apps
//                                                                           // im
//                                                                           // Reschedule-Zeitraum.
//            .rescheduleBetweenTimespan(von, bis, c));
//
//    if (appointmentliste != null) {
//        int CatAHours = anfang.getHours(); // holen von hh der von-Begrenzung
//                                           // der Category.
//        int CatAMin = anfang.getMinutes(); // holen von MM der von-Begrenzung
//                                           // der Category.
//        int CatEHours = ende.getHours(); // holen von hh der bis-Begrenzung der
//                                         // Category.
//        int CatEMin = ende.getMinutes(); // holen von MM der bis-Begrenzung der
//                                         // Category.
//        List<Appointment> sorted = new ArrayList<>();
//        for (Appointment app : appointmentliste) { // geht alle Apps im
//                                                   // Reschedule-Zeitraum
//                                                   // durch_______
//            // if(weErlaubt)
//            //
//            // Beginn 16:00
//            // Ende 20:00
//            int BeginHours = app.getBegin().getHours(); // holt hh Beginn
//                                                        // Schleifen-App.
//            int BeginMin = app.getBegin().getMinutes(); // holt MM Beginn
//                                                        // Schleifen-App.
//                                                        //
//            int EndHours = app.getEnd().getHours(); // holt hh Ende
//                                                    // Schleifen-App.
//            int EndMin = app.getEnd().getMinutes(); // holt MM Ende
//                                                    // Schleifen-App.
//                                                    //
//            if (BeginHours > CatAHours || (BeginHours == CatAHours && BeginMin >= CatAMin)) {// falls
//                                                                                             // Anfang
//                                                                                             // SchlApp
//                                                                                             // >=
//                                                                                             // Anfang
//                                                                                             // Cat
//                if (BeginHours == CatEHours && BeginMin < CatEMin) // falls (hh
//                                                                   // Anfang
//                                                                   // SchlApp ==
//                                                                   // hh Ende
//                                                                   // SchlApp)
//                                                                   // && (Begin
//                                                                   // SchlApp <
//                                                                   // MM Begin
//                                                                   // SchlApp)
//                                                                   // d.h. wenn
//                                                                   // das
//                                                                   // SchlApp
//                                                                   // vor Ende
//                                                                   // Cat
//                                                                   // anfängt
//                    sorted.add(app);
//                if (BeginHours < CatEHours) // falls hh Beginn SchlApp < hh Ende
//                                            // Cat
//                    sorted.add(app);
//            }
//            
//        }
//
//        // zu diesem Punkt befinden sich in der ArrayList sorted alle Apointments des
//        // reschedule-Zeitraums, die nach Anfang Cat und und min. 1 Minute vor
//        // Ende Cat beginnen
//
//
//        for (int i = 0; i < sorted.size(); i++) { // geht alle Apps in sorted
//                                                  // durch____________
//            if (i + 1 <= sorted.size()) {//
//                if (i == 0) { // erste App in sorted
//                    //
//                    // Von: 09:40
//                    // Bis: 19:40
//                    // 10:10
//                    // 19:30
//                    //
//                    Appointment ap = sorted.get(i); // holen von SchlApp in ap
//                    if (ap.getBegin() != von) { //
//                        if (von.getHours() > CatAHours
//                                || (von.getHours() == CatAHours && von.getMinutes() <= CatAMin))
//                        {
//                            if (von.getHours() < CatEHours)
//                            {
//                                Appointment neu = new Appointment();
//                                neu.setBegin(von);
//                                neu.setEnd(ap.getBegin());
//                                if (neu.getLength() >= a.getLength()) {
//                                    return von;
//                                }
//                            }
//                        }
//                    } else {
//                        Appointment b = sorted.get(i + 1);
//                        long zwischenzeit = getTimeBetweenAppointments(ap,
//                                b);
//                        if (zwischenzeit >= a.getLength()) {
//                            return ap.getEnd();
//                        }
//                    }
//                }
//                Appointment ap = sorted.get(i);
//                Appointment b = sorted.get(i + 1);
//                long zwischenzeit = getTimeBetweenAppointments(ap, b);
//                if (zwischenzeit >= a.getLength()) { //  falls Zeitraum zwischen sorted.get(i) & sorted.get(i+1) groß genug für toRescheduleApp
//                    //return ap.getEnd(); 
//                    Appointment tmp = new Appointment(); // temporäres Appointment erstellt
//                    tmp.setBegin(ap.getEnd());           // Ende von Appointment ap als Beginn des tmpApp
//                    tmp.setEnd(new Date(tmp.getBegin().getTime()+a.getLength()));// Anfang von tmpApp + Dauer von a als Ende des tmpApp
//                    // tmpApp wird nach Ende von Appointment ap gesetzt an und dauert a.getLength()
//                    if (tmp.getBegin().getHours()<ende.getHours()|| (tmp.getBegin().getHours() == ende.getHours() && tmp.getBegin().getMinutes()<= ende.getMinutes())){ // falls Anfang von tmpApp vor Ende Cat liegt.
//                        if (tmp.getEnd().getHours()<ende.getHours() || tmp.getEnd().getHours()== ende.getHours() && tmp.getEnd().getMinutes()<= ende.getMinutes()){ // falls Ende von tmpApp vor Ende Cat liegt.
//                            if (!cat.getWochenendeErlaubt()) // falls weekend not allowed
//                                if (!(tmp.getBegin().getDay()==0) && !(tmp.getBegin().getDay()==6)) //falls tmp nicht an WE liegt.
//                                    return tmp.getBegin();
//                        }
//                    }
//                    else{ // tmpApp wird vor Beginn von Appointment b gesetzt und dauert a.length()
//                        if (ap.getEnd().getMonth()==b.getBegin().getMonth() && ap.getEnd().getDay()+1)){ //falls zwischen ap und b kein ganzer freier tag dazwischen liegt.
//                        tmp.setEnd(b.getBegin());
//                        tmp.setBegin(new Date(tmp.getBegin().getTime()-a.getLength())); 
//                        if (tmp.getBegin().getHours() > ende.getHours()|| (tmp.getBegin().getHours() == ende.getHours() && tmp.getBegin().getMinutes() >= anfang.getMinutes()))
//                            if (!cat.getWochenendeErlaubt()) // falls weekend not allowed
//                                if (!(tmp.getBegin().getDay()==0) && !(tmp.getBegin().getDay()==6)) //falls tmp nicht an WE liegt.
//                                    return tmp.getBegin();
//                        } 
//                    }
//                }
//
//            }
//        }
//    }
//    else
//        JOptionPane.showMessageDialog(null, "Appointmentliste ist null");
//    JOptionPane.showMessageDialog(null,
//            "Es konnte kein Zwischenraum gefunden werden!");
//    return null;
//}
//
//public int getTimeBetweenAppointments(Appointment appointment1, Appointment appointment2) {
//    int gesamtDauer = 0;
//    Date endeAppointment1 = appointment1.getEnd();
//    Date beginnAppointment2 = appointment2.getBegin();
//    long a = endeAppointment1.getTime();
//    long b = beginnAppointment2.getTime();
//    if (b > a) {
//        long diff = beginnAppointment2.getTime()
//                - endeAppointment1.getTime();
//        double diffMinutes = diff / (60 * 1000);
//        double diffHours = diffMinutes / 60;
//        double diffSeconds = diffMinutes * 60;
//
//        int h = (int) diffHours;
//        double x = diffHours - h;
//        double y = x * 60;
//        int m = (int) y;
//        int hInMinuten = h * 60;
//        gesamtDauer = hInMinuten + m;
//    }
//    return gesamtDauer;
//}
//
//public int getLength(Appointment a) {
//    int gesamtDauerMiApp = 0;
//    Date beginnAppointment = a.getBegin();
//    Date endeAppointment = a.getEnd();
//    long an = beginnAppointment.getTime();
//    long b = endeAppointment.getTime();
//    if (b > an) {
//        long diff = beginnAppointment.getTime()
//                - beginnAppointment.getTime();
//        double diffMinutes = diff / (60 * 1000);
//        double diffHours = diffMinutes / 60;
//        double diffSeconds = diffMinutes * 60;
//
//        int h = (int) diffHours;
//        double x = diffHours - h;
//        double y = x * 60;
//        int m = (int) y;
//        int hInMinuten = h * 60;
//        gesamtDauerMiApp = hInMinuten + m;
//    }
//    return gesamtDauerMiApp;
//}
//
//public boolean appointmentAWithinAppointmentB(Appointment a, Appointment b)
//{
//    if ((a.getBegin().getHours() > b.getBegin().getHours() || (a.getBegin().getHours() == b
//            .getBegin().getHours() && a.getBegin()
//            .getMinutes() >= b.getBegin().getMinutes()))
//            && (a.getEnd().getHours() < b.getEnd().getHours() || (a.getEnd().getHours() == b
//                    .getEnd().getHours() && a.getEnd().getMinutes() <= b.getEnd().getMinutes())))
//        return true;
//    else
//        return false;
//}
//
//}
